<?php

namespace fastphp;

// 修改导入，使用实际的Request和Response类，而不是门面类
use fastphp\Request as RequestClass;
use fastphp\Response as ResponseClass;
use fastphp\facade\Config;  // Config可以继续使用门面

/**
 * 控制器基类
 * 符合MVC规范的控制器实现，负责请求处理和响应生成
 */
class Controller
{
    /**
     * 当前控制器名称
     * @var string
     */
    protected string $_controller;
    
    /**
     * 当前动作名称
     * @var string
     */
    protected string $_action;
    
    /**
     * 视图实例
     * @var View
     */
    protected View $_view;
    
    /**
     * 请求实例
     * @var RequestClass
     */
    protected RequestClass $_request;
    
    /**
     * 响应实例
     * @var ResponseClass
     */
    protected ResponseClass $_response;

    /**
     * 构造函数，初始化属性
     * @param string $controller 控制器名称
     * @param string $action 动作名称
     */
    public function __construct(string $controller, string $action)
    {
        $this->_controller = $controller;
        $this->_action = $action;
        
        // 初始化视图，从配置中获取模板配置
        $templateConfig = Config::get('template', []);
        $this->_view = new View($controller, $action, null, $templateConfig);
        
        // 初始化请求和响应对象
        $this->_request = new RequestClass();
        $this->_response = new ResponseClass();
        
        // 执行前置钩子
        $this->beforeAction();
    }
    
    /**
     * 析构函数，执行后置钩子
     */
    public function __destruct()
    {
        // 执行后置钩子
        $this->afterAction();
    }
    
    /**
     * 前置钩子方法，可被子类重写
     * 在动作执行前调用
     */
    protected function beforeAction(): void
    {
        // 子类可重写此方法
    }
    
    /**
     * 后置钩子方法，可被子类重写
     * 在动作执行后调用
     */
    protected function afterAction(): void
    {
        // 子类可重写此方法
    }

    /**
     * 设置视图变量
     * @param string|array $name 变量名或关联数组
     * @param mixed $value 变量值（当name为字符串时）
     * @return $this
     */
    public function set($name, $value = null): Controller
    {
        $this->_view->set($name, $value);
        return $this;
    }

    /**
     * 渲染视图
     * @param string|null $templatePath 模板路径
     */
    public function render(?string $templatePath = null): void
    {
        $this->_view->render($templatePath);
    }
    
    /**
     * 重定向到指定URL
     * @param string $url 目标URL
     * @param int $statusCode HTTP状态码
     */
    public function redirect(string $url, int $statusCode = 302): void
    {
        header('Location: ' . $url, true, $statusCode);
        exit;
    }
    
    /**
     * 返回JSON响应
     * @param string $msg 消息
     * @param array $data 数据
     * @param int $code 状态码
     */
    public function json(string $msg, array $data = [], int $code = 200): void
    {
        $this->_response->create($msg, $data, $code);
    }
    
    /**
     * 获取当前请求对象
     * @return RequestClass
     */
    public function request(): RequestClass
    {
        return $this->_request;
    }
    
    /**
     * 获取当前响应对象
     * @return ResponseClass
     */
    public function response(): ResponseClass
    {
        return $this->_response;
    }
}
